package com.bbva.general.dao.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;


import org.springframework.jdbc.core.JdbcTemplate;

import com.bbva.general.dao.AdminCargaDAO;
import com.bbva.general.entities.TipoCarga;
import com.bbva.general.util.CargaPendiente;

public class AdminCargaDAOImpl implements AdminCargaDAO
{

	DataSource dataSource;
	JdbcTemplate dbo;

	public DataSource getDataSource()
	{
		return dataSource;
	}

	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
	}

	public List<TipoCarga> ListarTipoCarga()
	{
		TipoCarga automatica = new TipoCarga();
		TipoCarga manual = new TipoCarga();
		automatica.setIdTipoCarga(1);
		automatica.setDescripcionTipoCarga("Automatica");
		manual.setIdTipoCarga(2);
		manual.setDescripcionTipoCarga("Manual");
		List<TipoCarga> listado = new ArrayList<TipoCarga>();
		listado.add(automatica);
		listado.add(manual);
		return listado;
	}

	public List<Map<String, Object>> ListarFiltro(int intIdTipoCarga, int intIdEstadoProceso, Date dtFechaInicio,
			Date dtFechaFin, String IdArchivoCargaFiltro)
	{
		// dataSource = (DataSource) JUtil.ObtenerBean("dataSource");
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>> resultado;
		String sql = "SELECT  distinct c.IDCARGA, ac.DESCRIPCION_ARCHIVO, c.REGISTROS_LEIDOS, c.REGISTROS_CARGADOS, "
				+ "c.IDTIPO_CARGA, " + "tc.NOMBRE_TIPO_CARGA, " + "c.RUTA_ARCHIVO, " + "c.NOMBRE_ARCHIVO, " + "c.FECHA_CARGA, "
				+ "c.HORA_INICIO, " + "c.HORA_FIN, " + "c.IDESTADO_PROCESO, " + "ep.NOMBRE_ESTADO_PROCESO, " + "c.NOTA_ERROR, "
				+ "ac.IDARCHIVO "
				+ "FROM  IITG.CARGA c " + "INNER JOIN IITG.TIPO_CARGA tc ON c.IDTIPO_CARGA = tc.IDTIPO_CARGA "
				+ "INNER JOIN IITG.ESTADO_PROCESO ep ON c.IDESTADO_PROCESO = ep.IDESTADO_PROCESO "
				+ "INNER JOIN IITG.ARCHIVO_CARGA ac ON c.IDARCHIVO = ac.IDARCHIVO " + "WHERE (? = 0 OR c.IDTIPO_CARGA = ?) "
				+ "AND (? = 0 OR c.IDESTADO_PROCESO = ?) " + "AND (c.FECHA_CARGA BETWEEN ? AND ?)  "
				+ "AND (? = 0 OR ac.IDARCHIVO = ?) ORDER BY c.IDCARGA DESC";
		resultado = dbo.queryForList(sql, intIdTipoCarga, intIdTipoCarga, intIdEstadoProceso, intIdEstadoProceso,
				dtFechaInicio, dtFechaFin, IdArchivoCargaFiltro,IdArchivoCargaFiltro);
		return resultado;
	}
	public List<Map<String, Object>> ListarArchivoCarga()
	{
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>> resultado;
		String sql = "SELECT IDARCHIVO, DESCRIPCION_ARCHIVO	FROM IITG.Archivo_Carga ";
		resultado = dbo.queryForList(sql);
		return resultado;
	}
	
	
	
	public List<Map<String, Object>> ListarCargaPendiente(String fechaCarga, String usuarioCarga, int tipoLista){
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>>resultado;
		String sql="";
		if (tipoLista==1){
				sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE TO_CHAR(FECHA_CARGA,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY') AND USUARIO_CREACION=? and IDESTADO_PROCESO=3";
				//sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE USUARIO_CREACION=? and IDESTADO_PROCESO=8";
				resultado = dbo.queryForList(sql,usuarioCarga);
		}else if (tipoLista==2){
			 	sql = "SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO FROM IITG.CARGA WHERE  TO_CHAR(FECHA_CARGA,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY') AND USUARIO_CREACION=? AND  IDESTADO_PROCESO=3 ";
			 	//sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE USUARIO_CREACION=? and IDESTADO_PROCESO=8";
			 	resultado = dbo.queryForList(sql,usuarioCarga);
		}else {
			 	sql = "SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO FROM IITG.CARGA WHERE  TO_CHAR(FECHA_CARGA,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY') AND USUARIO_CREACION=?  ORDER BY idcarga DESC ";
			//sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE USUARIO_CREACION=? and IDESTADO_PROCESO=8";
			 	resultado = dbo.queryForList(sql,usuarioCarga);
		}
		return resultado;
		
	}
	
	public CargaPendiente ObtenerEstadoCarga(String idCarga){
		CargaPendiente carga = new CargaPendiente();
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>> resultado;
		String sql = 	"SELECT  distinct c.IDCARGA, ac.DESCRIPCION_ARCHIVO, c.REGISTROS_LEIDOS, c.REGISTROS_CARGADOS, " + 
						"c.IDTIPO_CARGA,tc.NOMBRE_TIPO_CARGA, c.RUTA_ARCHIVO, c.NOMBRE_ARCHIVO, c.FECHA_CARGA, " + 
						"c.HORA_INICIO, c.HORA_FIN, c.IDESTADO_PROCESO, ep.NOMBRE_ESTADO_PROCESO, c.NOTA_ERROR " + 
						"FROM  IITG.CARGA c INNER JOIN IITG.TIPO_CARGA tc ON c.IDTIPO_CARGA = tc.IDTIPO_CARGA " + 
						"INNER JOIN IITG.ESTADO_PROCESO ep ON c.IDESTADO_PROCESO = ep.IDESTADO_PROCESO " + 
						"INNER JOIN IITG.ARCHIVO_CARGA ac ON c.IDARCHIVO = ac.IDARCHIVO WHERE  c.Idcarga = ?" ;
		resultado=dbo.queryForList(sql,idCarga);
		for (Map<String, Object>  resullt:resultado){	
			carga.setNombreEstado(resullt.get("NOMBRE_ESTADO_PROCESO").toString());
			carga.setNombreFormatoArchivo(resullt.get("DESCRIPCION_ARCHIVO").toString());
			carga.setHoraFinal(resullt.get("HORA_FIN").toString());
			carga.setIdCargaPendiente(Long.parseLong(resullt.get("IDCARGA").toString()));
		}
		return carga;
	}
	
	public List<Map<String, Object>> ListarIntervaloCargas(Long idAnterior,Long idNuevo){
		
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>>resultado;
		String sql="";
		 sql = 	"SELECT distinct c.IDCARGA, ac.DESCRIPCION_ARCHIVO, c.REGISTROS_LEIDOS, c.REGISTROS_CARGADOS, " + 
		"c.IDTIPO_CARGA,tc.NOMBRE_TIPO_CARGA, c.RUTA_ARCHIVO, c.NOMBRE_ARCHIVO, c.FECHA_CARGA, " + 
		"c.HORA_INICIO, c.HORA_FIN, c.IDESTADO_PROCESO, ep.NOMBRE_ESTADO_PROCESO, c.NOTA_ERROR " + 
		"FROM  IITG.CARGA c INNER JOIN IITG.TIPO_CARGA tc ON c.IDTIPO_CARGA = tc.IDTIPO_CARGA " + 
		"INNER JOIN IITG.ESTADO_PROCESO ep ON c.IDESTADO_PROCESO = ep.IDESTADO_PROCESO " + 
		"INNER JOIN IITG.ARCHIVO_CARGA ac ON c.IDARCHIVO = ac.IDARCHIVO WHERE  c.IDCARGA BETWEEN   ?+1 and ?" ;
		resultado = dbo.queryForList(sql,idAnterior,idNuevo);
		return resultado;
	}

	
	public List<Map<String, Object>> ListarCargaRapida(String fechaCarga, String usuarioCarga){
		dbo = new JdbcTemplate(dataSource);
		final List<Map<String, Object>>resultado;
		String sql="";
			 sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE TO_CHAR(FECHA_CARGA,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY') AND USUARIO_CREACION=? AND  IDCARGA =(Select max(IDCARGA) from IITG.CARGA where TO_CHAR(FECHA_CARGA,'DD/MM/YYYY')=TO_CHAR(SYSDATE,'DD/MM/YYYY') and USUARIO_CREACION=?)";
			 //sql="SELECT IDCARGA, FECHA_CARGA, IDESTADO_PROCESO, USUARIO_CREACION,1 AS CAMBIO_ESTADO  FROM IITG.CARGA  WHERE USUARIO_CREACION=? and IDESTADO_PROCESO=8";
			 resultado = dbo.queryForList(sql,usuarioCarga,usuarioCarga);
			 //resultado = dbo.queryForList(sql,usuarioCarga);
			 if (resultado.size()==0){
				 Map<String,Object> mapaCarga=new HashMap<String, Object>();
				 Calendar today = Calendar.getInstance();
				 String dia = "0"+Integer.toString(today.get(Calendar.DATE));
				 String mes = "0"+Integer.toString(today.get(Calendar.MONTH)+1);
				 String annio = Integer.toString(today.get(Calendar.YEAR));
				 String idCargaInicial=annio+(mes.substring(mes.length() - 2)) +(dia.substring(dia.length() - 2))+"0000";
				 System.out.println("=================================================="+idCargaInicial+"==================================================");
				 mapaCarga.put("IDCARGA", idCargaInicial);
				 mapaCarga.put("FECHA_CARGA", "2013/05/13");
				 mapaCarga.put("IDESTADO_PROCESO", "1");
				 mapaCarga.put("USUARIO_CREACION", "1564645665");
				 mapaCarga.put("CAMBIO_ESTADO", "1564645665");
				 resultado.add(mapaCarga);
			 }
		return resultado;
	}
	
	
}
